package com.kgc.scd.controller;

import com.kgc.scd.bean.Coupon;
import com.kgc.scd.bean.CouponInn;
import com.kgc.scd.bean.CouponUser;
import com.kgc.scd.bean.CouponUserInner;
import com.kgc.scd.service.CategoryService;
import com.kgc.scd.service.CouponService;
import com.kgc.scd.service.CouponUserInnerService;
import com.kgc.scd.util.PageSupport;
import com.kgc.scd.util.UserAnno;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created On : 2022/6/11.
 * <p>
 * Author     : nainai
 * <p>
 * Description: 优惠券操作入口
 */
@RestController
@Slf4j
public class CouponController {

    @Autowired
    private CouponService couponService;

    @Autowired
    private CategoryService categoryService;

    @Autowired
    private CouponUserInnerService couponUserInnerService;


    /**
     * @author : nainai
     * @date   : 2022/6/13
     * @param  : [java.lang.Integer]
     * @return : com.kgc.scd.util.RequestResult<java.util.List<com.kgc.scd.bean.Coupon>>
     * @description : 查询所有优惠券，支持种类查询，未启用的不查询
     */
    @GetMapping("/queryCoupons")
    public PageSupport<Coupon> queryCoupons(@RequestParam(required = false) Integer cid, @RequestParam(required = false, defaultValue = "1") Integer pageNo, @RequestParam(required = false, defaultValue = "3") Integer pageSize){
        log.info("查询种类为：{}的商品", cid);

        // 校验种类是否存在
        if (cid != null && cid != 0 && !categoryService.checkCidIsExist(cid)){
            return null;
        }

        // 调用业务接口，查询优惠券详情
        PageSupport<Coupon> coupons = couponService.queryCouponByCidAndCidZeroPage(cid, pageNo, pageSize);
        log.info("查询优惠券结果为：{}", coupons);

        // 该种类是否存在优惠券
        if (!coupons.getPageData().isEmpty()){
            return coupons;
        }

        return coupons;
    }

    /**
     * @author : nainai
     * @date   : 2022/6/13
     * @param  : [com.kgc.scd.util.UserAnno]
     * @return : java.util.List<com.kgc.scd.bean.Coupon>
     * @description : 查询用户已拥有的优惠券
     */
    @PostMapping("/queryUserCoupons")
    public List<CouponUser> queryUserCoupons(@RequestBody UserAnno userAnno){
        log.info("开始查询用户：{}，已拥有的优惠券");

        // 查询用户优惠券之前，进行用户优惠券失效状态更新
        couponService.checkUserCouponPast(userAnno.getUserId());

        // 调用业务接口，查询用户已拥有的优惠券,已过期的优惠券也会显示
        return couponService.queryCouponsByUid(userAnno.getUserId());
    }

    /**
     * @author : nainai
     * @date   : 2022/6/13
     * @param  : [com.kgc.scd.util.UserAnno, java.lang.Double, java.lang.Integer]
     * @return : com.kgc.scd.util.RequestResult<java.util.List<com.kgc.scd.bean.Coupon>>
     * @description : 查询订单可用优惠券
     */
    @PostMapping("/queryOrderCoupons")
    public List<CouponInn> queryOrderCoupons(@RequestBody UserAnno userAnno, @RequestParam String orderId){
        log.info("查询订单可用优惠券，用户：{}，订单号：{}", userAnno, orderId);

        // 查询可用优惠券
        List<Coupon> coupons = couponService.queryOrderCoupons(userAnno.getUserId(), orderId);

        return couponService.queryCouponInn(userAnno.getUserId(), coupons);
    }

    /**
     * @author : nainai
     * @date   : 2022/6/14
     * @param  : [java.util.List<com.kgc.scd.bean.Coupon>]
     * @return : com.kgc.scd.util.RequestResult<java.lang.String>
     * @description : 添加优惠券
     */
    @PostMapping("/insertCoupons")
    public boolean insertCoupons(@RequestBody List<Coupon> couponList) {
        log.info("添加优惠券，优惠券详情：{}", couponList);

        // 调用接口，执行添加
        if (couponService.addCoupons(couponList)) {
            return true;
        }
        return false;
    }

    /**
     * @author : nainai
     * @date   : 2022/6/14
     * @param  : [java.util.List<java.lang.Integer>]
     * @return : com.kgc.scd.util.RequestResult<java.lang.String>
     * @description : 修改优惠券启用状态
     */
    @PostMapping("/changeCouponsStatus")
    public boolean changeCouponsStatus(@RequestParam List<Integer> ids, @RequestParam Integer status) {
        log.info("修改优惠券启用状态：{}", ids);

        // 调用接口，执行修改
        if (couponService.changeCouponStatus(ids, status)) {
            return true;
        }
        return false;
    }

    /**
     * @author : nainai
     * @date   : 2022/6/14
     * @param  : [com.kgc.scd.util.UserAnno, java.lang.Integer]
     * @return : com.kgc.scd.util.RequestResult<java.lang.String>
     * @description : 用户领取优惠券
     */
    @PostMapping("/userPullCoupon")
    public Map<String, String> userPullCoupon(@RequestBody UserAnno userAnno, @RequestParam Integer coId) {
        log.info("用户：{}，领取优惠券：{}", userAnno, coId);

        Map<String, String> result = new HashMap<>();
        Coupon coupon = couponService.selectCouponById(coId);

        if (coupon == null) {
            // 说明优惠券不存在
            result.put("result", "优惠券不存在！");
            return result;
        }

        Map<String, String> map = couponService.userGetCoupon(userAnno.getUserId(), coId);
        if (!map.get("result").equals("true")) {
            // 领取失败，用户积分或优惠券库存不足
            return map;
        }
        result.put("result", "true");
        return result;
    }

    /**
     * @author : nainai
     * @date   : 2022/6/15
     * @param  : [java.lang.String, java.lang.Integer]
     * @return : boolean
     * @description : 判断优惠券是否可用，过期返回null，没过期返回优惠券对象
     */
    @PostMapping("/updateUserCouponIsLate")
    public Coupon updateUserCouponIsLate(@RequestParam String userId, @RequestParam Integer innerId) {
        log.info("用户：{}，优惠券：{}，进行优惠券过期校验", userId, innerId);

        // 更新用户优惠券状态
        couponService.checkUserCouponPast(userId);

        // 查询优惠券状态是否过期
        CouponUserInner couponUserInner = couponUserInnerService.getCouponUserInnerByInnerId(innerId);
        if (couponUserInner.getInnerStatus() == 0) {
            // 为未使用状态
            return couponService.selectCouponById(couponUserInner.getCouId());
        }

        return null;
    }

    /**
     * @author : nainai
     * @date   : 2022/6/15
     * @param  : [java.lang.String, java.lang.Integer]
     * @return : boolean
     * @description : 修改用户优惠券状态为已使用
     */
    @PostMapping("/changeUserCouponStatus")
    public boolean changeUserCouponStatus(@RequestParam Integer innerId) {
        log.info("优惠券：{}，改为已使用", innerId);

        // 修改优惠券状态
        return couponService.changeUserCouponStatus(innerId);
    }


}
